package tech.aistar.philosophy.lsp;

/**
 * 本类用来演示: 里氏替换原则
 *             - 子类不要破坏父类定义好的结构.子类尽量不要去重写父类中的方法.
 *             - 能用父类的地方一定也能够使用子类,用子类去替换父类 - "察觉不到".
 *             - 子类的参数类型要比父类的参数类型要更加宽松
 *
 * @author: success
 * @date: 2022/7/26 8:36 上午
 */
public class Sup {
    //public void test(Father father){
    //    System.out.println("Sup=>test");
    //}

    //推荐②
    public void test(Son son){
        System.out.println("Sup=>test2");
    }
}
class Sub extends Sup{
    //public void test(Son son){
    //    System.out.println("Sub=>test");
    //}

    //推荐②
    public void test(Father father){
        System.out.println("Sub=>test2");
    }
}
class Father{ // 比son的类型要更加宽松.

}
class Son extends Father{

}
class SupTest{
    public static void main(String[] args) {
        Son son = new Son();

        //使用父类
        Sup sup = new Sup();
        sup.test(son);  //Sup=>test2

        //使用子类
        Sub sub = new Sub();
        sub.test(son); // Sup=>test2

        //结果是一样的.因此使用使用子类来替代父类的使用

        Father s = new Son();
        sub.test(s);
    }
}